package com.yiyiooo.Abp.basics;

import android.util.Log;

import com.yiyiooo.Abp.utils.FileUtils;
import com.yiyiooo.pdacheckasset.MainActivity;

import org.threeten.bp.OffsetDateTime;
import org.threeten.bp.format.DateTimeFormatter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 日志处理
 * 因为可能会出现短时间内大量写入日志的情况，会频繁的打开关闭文件，影响性能。
 * 所以此处写日志并不一定马上写入文件，而是写入日志数组，再写入文件。
 * 因为上一条原因，可能丢失日志。
 * 加入日志超过时限自动清理功能，一次启动app最多清理一次。
 */
public class AbpLog {
    private static DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
    private static DateTimeFormatter dateTimeFormat = DateTimeFormatter.ISO_DATE_TIME;
    public static String packageName = MainActivity.class.getPackage().getName();
    private static List<String> logList = Collections.synchronizedList(new ArrayList<>());

    public static void i(String tag,String message){
        Log.i(tag,message);
        add("Info",tag, message);
    }
    public static void w(String tag,String message){
        Log.w(tag, message);
        add("Warn",tag, message);
    }
    public static void e(String tag, String message){
        Log.e(tag, message);
        add("Error",tag, message);
    }
    public static void d(String tag,String message){
        Log.d(tag, message);
        add("Debug",tag, message);
    }
    public static void v(String tag,String message){
        Log.v(tag,message);
        add("Verbose",tag, message);
    }
    private static void add(String v, String tag, String content){
        try {
            logList.add(v+" | "+OffsetDateTime.now().format(dateTimeFormat)+" | "+tag+" | "+content+"\n");
            writeLog();
        }catch (Exception ex){
            Log.e("AbpLog",ex.getMessage());
        }
    }
    private static boolean isWrite=false;
    private static String dirName = FileUtils.getSDPath()+ File.separator + packageName;
    private static boolean todayIsClearFile = false;

    /**
     * 写日志文件
     */
    private static void writeLog(){
        if(isWrite) return;
        isWrite = true;
        new Thread(){
            @Override
            public void run() {
                super.run();
                String dataStr = OffsetDateTime.now().format(dateFormat);
                String fileName = "Log_"+dataStr+".log";
                File file = new File(dirName+File.separator+fileName);
                if(!file.exists()){
                    FileWriter fw =null;
                    try {
                        File dir = new File(dirName);
                        if(!dir.exists()) dir.mkdirs();
                        if(!file.exists()) file.createNewFile();
                        fw=new FileWriter(file,true);
                        for (int i = 0; i < logList.size(); i++) {
                            fw.write(logList.remove(i));
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }finally {
                        if(fw!=null) {
                            try {
                                fw.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        isWrite = false;
                    }
                }else {
                    FileWriter fw =null;
                    try {
                        fw=new FileWriter(file,true);
                        for (int i = 0; i < logList.size(); i++) {
                            fw.write(logList.remove(i));
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }finally {
                        if(fw!=null) {
                            try {
                                fw.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        isWrite = false;
                    }
                }
                clearLogFile();
                try {
                    // 延迟1秒再退出，因为当1秒内多次写日志，但是文件打开关闭又比较快，就会出现每次写日志都是
                    // 打开文件-->写入日志-->关闭文件 的流程 造成没必要的io开销
                    Thread.sleep(1000l);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

    /**
     * 清理日志文件 只保留7天
     */
    private static void clearLogFile(){
        if(todayIsClearFile) return;
        List<File> files = FileUtils.searchFiles(new File(dirName));
        for (File f:files){
            if(f.exists()&&f.lastModified()<System.currentTimeMillis()-1000*60*60*24*7) f.delete();
        }
        todayIsClearFile = true;
    }
}
